package com.woniu.mgr.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    //盐可以定义在springboot配置文件中，通过@ConfigurationProperties注解去读取
    static String secret="qwertyuiopasdfghjklzxcvbnm!@#$%^&*()";

    //1.用于创建令牌的方法
    public static String getToken(Map claims, Integer minute){
        Key key = Keys.hmacShaKeyFor(secret.getBytes());
        return Jwts.builder()
            .setClaims(claims)//向payload中保存数据
            .setExpiration(new Date(System.currentTimeMillis() + (1000 * 60 * minute)))//设置令牌的过期时间,令牌的过期时间一定要大于当前系统时间
            .signWith(key)//加盐
            .compact();
    }

    //2.用于解析令牌的方法
    public static Claims parseToken(String token){
        Key key = Keys.hmacShaKeyFor(secret.getBytes());
        return Jwts.parserBuilder()
                .setSigningKey(key)//使用指定的盐
                .build()//创建解析令牌的对象
                .parseClaimsJws(token)//解析令牌
                .getBody();//获取载荷中保存的内容
    }

    // 从令牌中获取用户id
    public static Integer getUserIdFromReq(HttpServletRequest request){
        String token = getTokenFromReq(request);// 获取token
        return (Integer) parseToken(token).get("id");
    }

    // 从令牌中获取用户类型
    public static String getUserTypeFromReq(HttpServletRequest request){
        String token = getTokenFromReq(request);// 获取token
        return (String) parseToken(token).get("type");
    }

    // 从请求头中获取token
    public static String getTokenFromReq(HttpServletRequest request){
        String token = "";
        Cookie[] cookies = request.getCookies();// 获取Cookie集合 遍历集合取得信息
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("token")){
                token = cookie.getValue();
                break;
            }
        }
        return token;
    }

}
